import router, { asyncRoutes, resetRouter } from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'

// 滚动条配置 显示旋转球
NProgress.configure({ showSpinner: false }) // NProgress Configuration

// 白名单 ，不需要校验
const whiteList = ['/login', '/404'] // no redirect whitelist

router.beforeEach(async (to, from, next) => {
  // 滚动条开启
  NProgress.start()

  // 设置页面的标题
  document.title = getPageTitle(to.meta.title)

  // 获取cookies中的token
  const hasToken = getToken()
  // 如果有token 
  if (hasToken) {
    // 并且访问的路径是登录页 
    if (to.path === '/login') {
      // 直接放行到首页
      next({ path: '/' })
      // next({ path:'/404'})
      // 手动关闭滚动条，不然一直滚动，会导致系统崩溃报错
      NProgress.done()
    } else {
      // 判断是否获取用户信息 如果没有获取过，则执行获取下
      if (!store.getters.userId) {
        await store.dispatch("user/getUserInfo");

        // 假设登录之后返回的权限列表
        const menuList = ["/rights", "/reports", "/goods", "/orders"]

        // 过滤动态路由
        const filterRoutes = asyncRoutes.filter(item => {
          return menuList.includes(item.path)
          
        })

        // 404  保证404在路由最后面
        filterRoutes.push({ path: '*', redirect: '/404', hidden: true })

        // 重置路由，解决路由重复警告问题
        resetRouter()
        // 改写成动态添加的方式
        router.addRoutes(filterRoutes)

        // 访问vux中的setMenuList
        store.commit('menu/setMenuList', filterRoutes)

        // 解决刷新出现的白屏bug
        next({
          ...to, // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次)
          replace: true // 重进一次, 不保留重复历史
        })
      }
      // 如果不是去登录页，并且获取了用户信息，直接放行
      next()

    }
  } else {
    // 如果没有token，判断访问路径是否在白名单中，如果有
    if (whiteList.indexOf(to.path) !== -1) {
      // 则直接放行
      next()
    } else {
      // 找不到则直接到登录页
      next(`/login`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  // 滚动条结束
  NProgress.done()
})
